Overview

This document contains instructions on Project 2 for STA 141A in Winter 2021. This document is made with R markdown. The rmd file to generate this document is available on the course website.

Background

WHO COVID-19 data

We will do an EDA for the WHO COVID-19 data. You can take a look at the weekly WHO COVID-19 update for reference.

library(tidyverse)
library(readxl)
library(data.table)
library(cowplot)
library(kableExtra)

Attaching package: ‘kableExtra’

The following object is masked from ‘package:dplyr’:

    group_rows
covidmobility <- read_csv("~/Downloads/Global_Mobility_Report.csv") %>% filter(is.na(sub_region_1)) %>% mutate(Date_reported = as.Date(date), Country_code = country_region_code) %>% select(-c("sub_region_1",
"sub_region_2",
"metro_area",
"iso_3166_2_code",
"census_fips_code"))
Parsed with column specification:
cols(
  country_region_code = col_character(),
  country_region = col_character(),
  sub_region_1 = col_character(),
  sub_region_2 = col_logical(),
  metro_area = col_logical(),
  iso_3166_2_code = col_character(),
  census_fips_code = col_logical(),
  place_id = col_character(),
  date = col_date(format = ""),
  retail_and_recreation_percent_change_from_baseline = col_double(),
  grocery_and_pharmacy_percent_change_from_baseline = col_double(),
  parks_percent_change_from_baseline = col_double(),
  transit_stations_percent_change_from_baseline = col_double(),
  workplaces_percent_change_from_baseline = col_double(),
  residential_percent_change_from_baseline = col_double()
)
4617003 parsing failures.
 row        col           expected                  actual                                     file
3324 metro_area 1/0/T/F/TRUE/FALSE Kabul Metropolitan Area '~/Downloads/Global_Mobility_Report.csv'
3325 metro_area 1/0/T/F/TRUE/FALSE Kabul Metropolitan Area '~/Downloads/Global_Mobility_Report.csv'
3326 metro_area 1/0/T/F/TRUE/FALSE Kabul Metropolitan Area '~/Downloads/Global_Mobility_Report.csv'
3327 metro_area 1/0/T/F/TRUE/FALSE Kabul Metropolitan Area '~/Downloads/Global_Mobility_Report.csv'
3328 metro_area 1/0/T/F/TRUE/FALSE Kabul Metropolitan Area '~/Downloads/Global_Mobility_Report.csv'
.... .......... .................. ....................... ........................................
See problems(...) for more details.
covidWHO <- read_csv("https://covid19.who.int/WHO-COVID-19-global-data.csv") %>%  mutate(Date_reported = as.Date(Date_reported))
Parsed with column specification:
cols(
  Date_reported = col_date(format = ""),
  Country_code = col_character(),
  Country = col_character(),
  WHO_region = col_character(),
  New_cases = col_double(),
  Cumulative_cases = col_double(),
  New_deaths = col_double(),
  Cumulative_deaths = col_double()
)
world_pop = read_csv("~/Downloads/csvData.csv") %>% mutate(Country = name)
Parsed with column specification:
cols(
  Rank = col_double(),
  name = col_character(),
  pop2021 = col_double(),
  pop2020 = col_double(),
  GrowthRate = col_double(),
  area = col_double(),
  Density = col_double()
)

covidmobility
covidmobility
covidWHO
covid_data
covid_month_data_20 = covid_data %>% 
  na.omit() %>%
  #filter(Year == "2020") %>%
  group_by(Country_code,Country,Month,Year) %>% 
  summarise(
        Country_code = unique(Country_code),
           Country = unique(Country),
           retail_and_recreation_percent_change_from_baseline = mean(retail_and_recreation_percent_change_from_baseline),   
           grocery_and_pharmacy_percent_change_from_baseline =mean(grocery_and_pharmacy_percent_change_from_baseline) ,
           parks_percent_change_from_baseline = mean(parks_percent_change_from_baseline),
           transit_stations_percent_change_from_baseline = mean(transit_stations_percent_change_from_baseline),  
           workplaces_percent_change_from_baseline = mean(workplaces_percent_change_from_baseline),
           residential_percent_change_from_baseline = mean(residential_percent_change_from_baseline),
           WHO_region = unique(WHO_region),
           New_cases = sum(New_cases),
           Cumulative_cases = max(Cumulative_cases),
           New_deaths = sum(New_deaths),
           Cumulative_deaths = max(Cumulative_deaths) ) 
`summarise()` regrouping output by 'Country_code', 'Country', 'Month' (override with `.groups` argument)
#covid_data %>% filter(Month %in% c("01","02","03"), Country == "United Arab Emirates",Year == "2020") %>% select(Date_reported,New_cases,Cumulative_cases,New_deaths,Cumulative_deaths)
        Retail_Rec_change 
        Grocery_Pharm_change
        Parks_change 
        Transit_Stations_change 
        Work_change 
        Resid_change 
lm(data = country_data, cases_per_capita_2020 ~ Retail_Rec_change +
            Grocery_Pharm_change+
            Parks_change +
            Transit_Stations_change +
            Work_change +
            Resid_change ) %>%
anova()
Analysis of Variance Table

Response: cases_per_capita_2020
                         Df Sum Sq Mean Sq F value    Pr(>F)    
Retail_Rec_change         1  13648 13648.1 38.1507 1.177e-08 ***
Grocery_Pharm_change      1   2604  2604.4  7.2800  0.008093 ** 
Parks_change              1  13787 13787.3 38.5399 1.016e-08 ***
Transit_Stations_change   1    120   120.3  0.3364  0.563149    
Work_change               1    255   254.7  0.7119  0.400694    
Resid_change              1    923   923.1  2.5803  0.111120    
Residuals               108  38636   357.7                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

This data set is maintained by WHO and updated constantly. The first task for you is to understand this data set, e.g., the meaning of the variables and their values. To this end, you can make use of your preferred search engine, or read the documentation for this data set.

In this project, you are a team of conscientious statisticians, who wish to help the general public understand the ongoing pandemic.

Suggested outline

The following list provides one potential structure of the data analysis report. As this is the final project, the following suggestions are intended to provide one viable route for your project while leaving you as much freedom as possible.


  1. Before writing your analysis report, you may want to explore this data set and read about the coronavirus to generate the hypothesis or question to be answered in this report, i.e., the question(s) of interest. You can be creative on this question so long as it meets three conditions.

    1. This question might be meaningful in real-world.
    2. A method discussed in this course is employed in solving this question.
    3. This question does not ask for causality.

  1. Introduce the dataset and the questions of interest. asc

  2. Review the background of the coronavirus.

  3. Explore this dataset and generate summary statistics that you find informative, and explain your findings. The summary statistics should include at least time, number of cases, number of death, case-mortality rate.

  4. Propose an appropriate model to answer the questions of interest.

    1. Explain your notations.
    2. State assumptions for your model.
    3. Explain why your model is appropriate for this task.
  5. Fit the proposed model in (4) and explain your results.

  6. Conduct model diagnostics and/or sensitivity analysis.

  7. Conclude your analysis with a discussion of your findings and caveats of your approach.


Abstract


Introduction


Background


Descriptive analysis


Inferential analysis


Sensitivity analysis


Discussion


Acknowledgement

Zhang, Zitong


Reference


Appendix


Session info

LS0tCnRpdGxlOiAiUHJvamVjdCAyIERlc2NyaXB0aW9uIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2xsYXBzZWQ6IG5vCiAgICBkZl9wcmludDogcGFnZWQKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgojIyBPdmVydmlldwoKVGhpcyBkb2N1bWVudCBjb250YWlucyBpbnN0cnVjdGlvbnMgb24gUHJvamVjdCAyIGZvciBTVEEgMTQxQSBpbiBXaW50ZXIgMjAyMS4gVGhpcyBkb2N1bWVudCBpcyBtYWRlIHdpdGggYFIgbWFya2Rvd25gLiBUaGUgYHJtZGAgZmlsZSB0byBnZW5lcmF0ZSB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgY291cnNlIHdlYnNpdGUuIAoKIyBCYWNrZ3JvdW5kCgoKCiMjIFdITyBDT1ZJRC0xOSBkYXRhCgpXZSB3aWxsIGRvIGFuIEVEQSBmb3IgdGhlIFdITyBDT1ZJRC0xOSBkYXRhLiBZb3UgY2FuIHRha2UgYSBsb29rIGF0IHRoZSBbd2Vla2x5IFdITyBDT1ZJRC0xOSB1cGRhdGVdKGh0dHBzOi8vd3d3Lndoby5pbnQvZW1lcmdlbmNpZXMvZGlzZWFzZXMvbm92ZWwtY29yb25hdmlydXMtMjAxOS9zaXR1YXRpb24tcmVwb3J0cykgZm9yIHJlZmVyZW5jZS4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShrYWJsZUV4dHJhKQpgYGAKCmBgYHtyfQpjb3ZpZG1vYmlsaXR5IDwtIHJlYWRfY3N2KCJ+L0Rvd25sb2Fkcy9HbG9iYWxfTW9iaWxpdHlfUmVwb3J0LmNzdiIpICU+JSBmaWx0ZXIoaXMubmEoc3ViX3JlZ2lvbl8xKSkgJT4lIG11dGF0ZShEYXRlX3JlcG9ydGVkID0gYXMuRGF0ZShkYXRlKSwgQ291bnRyeV9jb2RlID0gY291bnRyeV9yZWdpb25fY29kZSkgJT4lIHNlbGVjdCgtYygic3ViX3JlZ2lvbl8xIiwKInN1Yl9yZWdpb25fMiIsCiJtZXRyb19hcmVhIiwKImlzb18zMTY2XzJfY29kZSIsCiJjZW5zdXNfZmlwc19jb2RlIikpCgoKCgpjb3ZpZFdITyA8LSByZWFkX2NzdigiaHR0cHM6Ly9jb3ZpZDE5Lndoby5pbnQvV0hPLUNPVklELTE5LWdsb2JhbC1kYXRhLmNzdiIpICU+JSAgbXV0YXRlKERhdGVfcmVwb3J0ZWQgPSBhcy5EYXRlKERhdGVfcmVwb3J0ZWQpKQoKd29ybGRfcG9wID0gcmVhZF9jc3YoIn4vRG93bmxvYWRzL2NzdkRhdGEuY3N2IikgJT4lIG11dGF0ZShDb3VudHJ5ID0gbmFtZSkKYGBgCmBgYHtyfQpjb3ZpZG1vYmlsaXR5CmBgYAoKYGBge3J9CmNvdmlkbW9iaWxpdHkKY292aWRXSE8KYGBgCgpgYGB7cn0KY292aWRfZGF0YSA9IGlubmVyX2pvaW4oY292aWRtb2JpbGl0eSxjb3ZpZFdITyxieSA9IGMoIkNvdW50cnlfY29kZSIsIkRhdGVfcmVwb3J0ZWQiKSkgJT4lIAogIHNlbGVjdChjKAogICAgICAgICAgICJDb3VudHJ5X2NvZGUiLAogICAgICAgICAgICJDb3VudHJ5IiwKICAgICAgICAgICAiRGF0ZV9yZXBvcnRlZCIsCiAgICAgICAgICAgInJldGFpbF9hbmRfcmVjcmVhdGlvbl9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lIiwgICAKICAgICAgICAgICAiZ3JvY2VyeV9hbmRfcGhhcm1hY3lfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSIsCiAgICAgICAgICAgInBhcmtzX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUiLAogICAgICAgICAgICJ0cmFuc2l0X3N0YXRpb25zX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUiLCAgCiAgICAgICAgICAgIndvcmtwbGFjZXNfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSIsCiAgICAgICAgICAgInJlc2lkZW50aWFsX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUiLAogICAgICAgICAgICJXSE9fcmVnaW9uIiwKICAgICAgICAgICAiTmV3X2Nhc2VzIiwKICAgICAgICAgICAiQ3VtdWxhdGl2ZV9jYXNlcyIsCiAgICAgICAgICAgIk5ld19kZWF0aHMiLAogICAgICAgICAgICJDdW11bGF0aXZlX2RlYXRocyIpKSAlPiUKICBtdXRhdGUoWWVhciA9IHN1YnN0cihEYXRlX3JlcG9ydGVkLDEsNCksCiAgICAgICAgIE1vbnRoID0gc3Vic3RyKERhdGVfcmVwb3J0ZWQsNiw3KSkgCgoKYGBgCgoKYGBge3J9CmNvdmlkX21vbnRoX2RhdGFfMjAgPSBjb3ZpZF9kYXRhICU+JSAKICBuYS5vbWl0KCkgJT4lCiAgI2ZpbHRlcihZZWFyID09ICIyMDIwIikgJT4lCiAgZ3JvdXBfYnkoQ291bnRyeV9jb2RlLENvdW50cnksTW9udGgsWWVhcikgJT4lIAogIHN1bW1hcmlzZSgKICAgICAgICBDb3VudHJ5X2NvZGUgPSB1bmlxdWUoQ291bnRyeV9jb2RlKSwKICAgICAgICAgICBDb3VudHJ5ID0gdW5pcXVlKENvdW50cnkpLAogICAgICAgICAgIHJldGFpbF9hbmRfcmVjcmVhdGlvbl9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gbWVhbihyZXRhaWxfYW5kX3JlY3JlYXRpb25fcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSksICAgCiAgICAgICAgICAgZ3JvY2VyeV9hbmRfcGhhcm1hY3lfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSA9bWVhbihncm9jZXJ5X2FuZF9waGFybWFjeV9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lKSAsCiAgICAgICAgICAgcGFya3NfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSA9IG1lYW4ocGFya3NfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSksCiAgICAgICAgICAgdHJhbnNpdF9zdGF0aW9uc19wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gbWVhbih0cmFuc2l0X3N0YXRpb25zX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUpLCAgCiAgICAgICAgICAgd29ya3BsYWNlc19wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gbWVhbih3b3JrcGxhY2VzX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUpLAogICAgICAgICAgIHJlc2lkZW50aWFsX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUgPSBtZWFuKHJlc2lkZW50aWFsX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUpLAogICAgICAgICAgIFdIT19yZWdpb24gPSB1bmlxdWUoV0hPX3JlZ2lvbiksCiAgICAgICAgICAgTmV3X2Nhc2VzID0gc3VtKE5ld19jYXNlcyksCiAgICAgICAgICAgQ3VtdWxhdGl2ZV9jYXNlcyA9IG1heChDdW11bGF0aXZlX2Nhc2VzKSwKICAgICAgICAgICBOZXdfZGVhdGhzID0gc3VtKE5ld19kZWF0aHMpLAogICAgICAgICAgIEN1bXVsYXRpdmVfZGVhdGhzID0gbWF4KEN1bXVsYXRpdmVfZGVhdGhzKSApIApgYGAKYGBge3J9CiNjb3ZpZF9kYXRhICU+JSBmaWx0ZXIoTW9udGggJWluJSBjKCIwMSIsIjAyIiwiMDMiKSwgQ291bnRyeSA9PSAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLFllYXIgPT0gIjIwMjAiKSAlPiUgc2VsZWN0KERhdGVfcmVwb3J0ZWQsTmV3X2Nhc2VzLEN1bXVsYXRpdmVfY2FzZXMsTmV3X2RlYXRocyxDdW11bGF0aXZlX2RlYXRocykKYGBgCgpgYGB7cn0KY291bnRyeV9kYXRhID0gY292aWRfZGF0YSAlPiUgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIG5hLm9taXQoKSAlPiUgc3VtbWFyaXNlKE51bWJlcl9DYXNlcyA9IG1heChDdW11bGF0aXZlX2Nhc2VzKSwKICAgICAgICAgICAgTnVtYmVyX0RlYXRocyA9IG1heChDdW11bGF0aXZlX2RlYXRocyksCiAgICAgICAgICAgIGNhc2VfbW9ydGFsaXR5X3JhdGUgPSBOdW1iZXJfRGVhdGhzL051bWJlcl9DYXNlcywKICAgICAgICAgICAgUmV0YWlsX1JlY19jaGFuZ2UgPSBtZWFuKHJldGFpbF9hbmRfcmVjcmVhdGlvbl9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lKSwKICAgICAgICAgICAgR3JvY2VyeV9QaGFybV9jaGFuZ2UgPSBtZWFuKGdyb2NlcnlfYW5kX3BoYXJtYWN5X3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUpLAogICAgICAgICAgICBQYXJrc19jaGFuZ2UgPSBtZWFuKHBhcmtzX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUpLAogICAgICAgICAgICBUcmFuc2l0X1N0YXRpb25zX2NoYW5nZSA9IG1lYW4odHJhbnNpdF9zdGF0aW9uc19wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lKSwKICAgICAgICAgICAgV29ya19jaGFuZ2UgPSBtZWFuKHdvcmtwbGFjZXNfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSksCiAgICAgICAgICAgIFJlc2lkX2NoYW5nZSA9IG1lYW4ocmVzaWRlbnRpYWxfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSkpCgoKY291bnRyeV9kYXRhID0gaW5uZXJfam9pbihjb3VudHJ5X2RhdGEsIHdvcmxkX3BvcCwgYnkgID0gIkNvdW50cnkiICkgJT4lIAogIG11dGF0ZShjYXNlc19wZXJfY2FwaXRhXzIwMjAgPSBOdW1iZXJfQ2FzZXMvcG9wMjAyMSwKICAgICAgICAgZGVhdGhzX3Blcl9jYXBpdGFfMjAyMCA9IE51bWJlcl9EZWF0aHMvcG9wMjAyMSkKCmBgYAogICAgICAgICAgICBSZXRhaWxfUmVjX2NoYW5nZSAKICAgICAgICAgICAgR3JvY2VyeV9QaGFybV9jaGFuZ2UKICAgICAgICAgICAgUGFya3NfY2hhbmdlIAogICAgICAgICAgICBUcmFuc2l0X1N0YXRpb25zX2NoYW5nZSAKICAgICAgICAgICAgV29ya19jaGFuZ2UgCiAgICAgICAgICAgIFJlc2lkX2NoYW5nZSAKYGBge3J9CmxtKGRhdGEgPSBjb3VudHJ5X2RhdGEsIGNhc2VzX3Blcl9jYXBpdGFfMjAyMCB+IFJldGFpbF9SZWNfY2hhbmdlICsKICAgICAgICAgICAgR3JvY2VyeV9QaGFybV9jaGFuZ2UrCiAgICAgICAgICAgIFBhcmtzX2NoYW5nZSArCiAgICAgICAgICAgIFRyYW5zaXRfU3RhdGlvbnNfY2hhbmdlICsKICAgICAgICAgICAgV29ya19jaGFuZ2UgKwogICAgICAgICAgICBSZXNpZF9jaGFuZ2UgKSAlPiUKYW5vdmEoKQpgYGAKCgpUaGlzIGRhdGEgc2V0IGlzIG1haW50YWluZWQgYnkgV0hPIGFuZCB1cGRhdGVkIGNvbnN0YW50bHkuIFRoZSBmaXJzdCB0YXNrIGZvciB5b3UgaXMgdG8gdW5kZXJzdGFuZCB0aGlzIGRhdGEgc2V0LCBlLmcuLCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaWFibGVzIGFuZCB0aGVpciB2YWx1ZXMuIFRvIHRoaXMgZW5kLCB5b3UgY2FuIG1ha2UgdXNlIG9mIHlvdXIgcHJlZmVycmVkIHNlYXJjaCBlbmdpbmUsIG9yIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZGF0YSBzZXQuIAoKSW4gdGhpcyBwcm9qZWN0LCB5b3UgYXJlIGEgdGVhbSBvZiBjb25zY2llbnRpb3VzIHN0YXRpc3RpY2lhbnMsIHdobyB3aXNoIHRvIGhlbHAgdGhlIGdlbmVyYWwgcHVibGljIHVuZGVyc3RhbmQgdGhlIG9uZ29pbmcgcGFuZGVtaWMuIAoKCgojIyBTdWdnZXN0ZWQgb3V0bGluZSAKClRoZSBmb2xsb3dpbmcgbGlzdCBwcm92aWRlcyBvbmUgcG90ZW50aWFsIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBhbmFseXNpcyByZXBvcnQuIEFzIHRoaXMgaXMgdGhlIGZpbmFsIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgc3VnZ2VzdGlvbnMgYXJlIGludGVuZGVkIHRvIHByb3ZpZGUgb25lIHZpYWJsZSByb3V0ZSBmb3IgeW91ciBwcm9qZWN0IHdoaWxlIGxlYXZpbmcgeW91IGFzIG11Y2ggZnJlZWRvbSBhcyBwb3NzaWJsZS4gCgoqKioKCjAuIEJlZm9yZSB3cml0aW5nIHlvdXIgYW5hbHlzaXMgcmVwb3J0LCB5b3UgbWF5IHdhbnQgdG8gZXhwbG9yZSB0aGlzIGRhdGEgc2V0IGFuZCByZWFkIGFib3V0IHRoZSBjb3JvbmF2aXJ1cyB0byBnZW5lcmF0ZSB0aGUgaHlwb3RoZXNpcyBvciBxdWVzdGlvbiB0byBiZSBhbnN3ZXJlZCBpbiB0aGlzIHJlcG9ydCwgaS5lLiwgdGhlIHF1ZXN0aW9uKHMpIG9mIGludGVyZXN0LiBZb3UgY2FuIGJlIGNyZWF0aXZlIG9uIHRoaXMgcXVlc3Rpb24gc28gbG9uZyBhcyBpdCBtZWV0cyB0aHJlZSBjb25kaXRpb25zLgoKICAgIGEuIFRoaXMgcXVlc3Rpb24gbWlnaHQgYmUgbWVhbmluZ2Z1bCBpbiByZWFsLXdvcmxkLiAKICAgIGIuIEEgbWV0aG9kIGRpc2N1c3NlZCBpbiB0aGlzIGNvdXJzZSBpcyBlbXBsb3llZCBpbiBzb2x2aW5nIHRoaXMgcXVlc3Rpb24uIAogICAgYy4gVGhpcyBxdWVzdGlvbiBkb2VzIG5vdCBhc2sgZm9yIGNhdXNhbGl0eS4gIAoKKioqCgoKMS4gSW50cm9kdWNlIHRoZSBkYXRhc2V0IGFuZCB0aGUgcXVlc3Rpb25zIG9mIGludGVyZXN0LiBhc2MKCjIuIFJldmlldyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgY29yb25hdmlydXMuIAoKMy4gRXhwbG9yZSB0aGlzIGRhdGFzZXQgYW5kIGdlbmVyYXRlIHN1bW1hcnkgc3RhdGlzdGljcyB0aGF0IHlvdSBmaW5kIGluZm9ybWF0aXZlLCBhbmQgZXhwbGFpbiB5b3VyIGZpbmRpbmdzLiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4gVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCB0aW1lLCBudW1iZXIgb2YgY2FzZXMsIG51bWJlciBvZiBkZWF0aCwgY2FzZS1tb3J0YWxpdHkgcmF0ZS48L3NwYW4+Cgo0LiAgUHJvcG9zZSBhbiBhcHByb3ByaWF0ZSBtb2RlbCB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9ucyBvZiBpbnRlcmVzdC4gCiAgICAgIGEuIEV4cGxhaW4geW91ciBub3RhdGlvbnMuIAogICAgICBiLiBTdGF0ZSBhc3N1bXB0aW9ucyBmb3IgeW91ciBtb2RlbC4gCiAgICAgIGMuIEV4cGxhaW4gd2h5IHlvdXIgbW9kZWwgaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgdGFzay4gCgoKNS4gIEZpdCB0aGUgcHJvcG9zZWQgbW9kZWwgaW4gKDQpIGFuZCBleHBsYWluIHlvdXIgcmVzdWx0cy4gCgo2LiAgQ29uZHVjdCBtb2RlbCBkaWFnbm9zdGljcyBhbmQvb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMuIAoKNy4gQ29uY2x1ZGUgeW91ciBhbmFseXNpcyB3aXRoIGEgZGlzY3Vzc2lvbiBvZiB5b3VyIGZpbmRpbmdzIGFuZCBjYXZlYXRzIG9mIHlvdXIgYXBwcm9hY2guIAoKCioqKgoKIyBBYnN0cmFjdAoKKioqCgojIEludHJvZHVjdGlvbgoKKioqCgojIEJhY2tncm91bmQgCgoqKioKCiMgRGVzY3JpcHRpdmUgYW5hbHlzaXMgCgoqKioKCiMgSW5mZXJlbnRpYWwgYW5hbHlzaXMKCioqKgoKIyBTZW5zaXRpdml0eSBhbmFseXNpcyAKCioqKgoKIyBEaXNjdXNzaW9uIAoKKioqCgojIEFja25vd2xlZGdlbWVudCB7LX0KCgpaaGFuZywgWml0b25nCgoqKioKCiMgUmVmZXJlbmNlIHstfQoKCioqKgoKIyBBcHBlbmRpeCB7LX0KYGBge3IsIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLGVjaG89VFJVRSxldmFsPUZBTFNFfQpgYGAKCioqKgoKIyBTZXNzaW9uIGluZm8gey19CgoK